package com.nep.NEPS.controller;

import com.nep.common.util.ApplicationContextUtil;
import com.nep.common.util.AuthUtil;
import com.nep.common.util.SceneSwitcherUtil;
import com.nep.entity.supervisor.User;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.TextField;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;

import static com.nep.common.util.AlertUtil.*;

/**
 * 监督员网格选择控制器
 * 处理公众监督员选择负责网格地址的业务逻辑
 * 实现省市区三级联动选择和详细地址填写功能
 */
public class SupervisorGridSelectViewController {
    @FXML private ComboBox<String> provinceComboBox;  // 省份选择下拉框
    @FXML private ComboBox<String> cityComboBox;      // 城市选择下拉框
    @FXML private ComboBox<String> districtComboBox;  // 区县选择下拉框
    @FXML private TextField detailAddressField;       // 详细地址输入框
    @FXML private Button saveBtn;                     // 保存地址按钮
    @FXML private Button backBtn;                     // 返回按钮

    private User currentUser;                         // 当前登录用户
    private Map<String, Set<String>> provinceCityMap = new HashMap<>(); // 省-市映射关系
    private Map<String, Set<String>> cityDistrictMap = new HashMap<>(); // 市-区映射关系

    /**
     * 初始化方法（由FXML加载器自动调用）
     * 完成数据初始化、UI组件配置和事件绑定
     */
    public void initialize() {
        // 检查用户登录状态，未登录则跳转登录页面
        AuthUtil.checkLoginStatus(backBtn);

        currentUser = ApplicationContextUtil.getInstance().getCurrentUser();
        if (currentUser == null) {
            showError("系统错误", "未能获取当前用户信息，请重新登录");
            return;
        }

        // 加载省市区地址数据
        initializeData();

        // 配置下拉框联动逻辑
        initializeComboBoxes();

        // 绑定按钮事件处理方法
        saveBtn.setOnAction(event -> handleSaveAddress());
        backBtn.setOnAction(event -> handleBack());
    }

    /**
     * 从文件加载省市区地址数据
     * 数据格式要求：每行包含省 市 区，以空格分隔
     */
    private void initializeData() {
        try (BufferedReader br = new BufferedReader(new FileReader("address_data.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                String[] parts = line.split(" ");
                if (parts.length == 3) {
                    String province = parts[0];
                    String city = parts[1];
                    String district = parts[2];

                    // 构建省-市映射关系
                    provinceCityMap.computeIfAbsent(province, k -> new HashSet<>()).add(city);

                    // 构建市-区映射关系
                    cityDistrictMap.computeIfAbsent(city, k -> new HashSet<>()).add(district);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
            showError("系统错误", "读取地址数据文件时发生异常: " + e.getMessage());
        }
    }

    /**
     * 初始化下拉框组件并设置联动逻辑
     * 实现省份选择变化时更新城市列表
     * 实现城市选择变化时更新区县列表
     */
    private void initializeComboBoxes() {
        // 加载所有省份到下拉框
        provinceComboBox.getItems().addAll(provinceCityMap.keySet());

        // 省份选择变化监听器
        provinceComboBox.valueProperty().addListener((observable, oldValue, newValue) -> {
            if (newValue != null) {
                // 清空城市和区县列表
                cityComboBox.getItems().clear();
                districtComboBox.getItems().clear();

                // 加载对应省份的城市列表
                cityComboBox.getItems().addAll(provinceCityMap.get(newValue));
                cityComboBox.setValue(null);
                districtComboBox.setValue(null);
            }
        });

        // 城市选择变化监听器
        cityComboBox.valueProperty().addListener((observable, oldValue, newValue) -> {
            if (newValue != null) {
                // 清空区县列表
                districtComboBox.getItems().clear();

                // 加载对应城市的区县列表
                if (cityDistrictMap.containsKey(newValue)) {
                    districtComboBox.getItems().addAll(cityDistrictMap.get(newValue));
                }
                districtComboBox.setValue(null);
            }
        });
    }

    /**
     * 处理保存地址按钮点击事件
     * 验证输入数据、组装完整地址并更新用户信息
     */
    @FXML
    private void handleSaveAddress() {
        String province = provinceComboBox.getValue();
        String city = cityComboBox.getValue();
        String district = districtComboBox.getValue();
        String detail = detailAddressField.getText().trim();

        // 输入验证
        if (province == null || city == null || district == null || detail.isEmpty()) {
            showError("保存失败", "请完成所有地址信息的选择和填写");
            return;
        }

        try {
            // 组装完整地址
            String fullAddress = province + " " + city + " " + district + " " + detail;
            currentUser.setGridAddress(fullAddress);

            // 调用用户服务更新地址信息
            boolean success = ApplicationContextUtil.getInstance().getUserService().updateUser(currentUser);
            if (success) {
                showInfo("保存成功", "地址已成功保存");
                // 跳转到监督员主界面
                SceneSwitcherUtil.switchScene(saveBtn, "/com/nep/NEPS/view/SupervisorMainView.fxml");
            } else {
                showError("保存失败", "更新用户信息失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
            showError("系统错误", "保存地址时发生异常: " + e.getMessage());
        }
    }

    /**
     * 处理返回按钮点击事件
     * 导航到监督员主界面
     */
    @FXML
    private void handleBack() {
        SceneSwitcherUtil.switchScene(backBtn, "/com/nep/NEPS/view/SupervisorMainView.fxml");
    }
}